package com.itheima.common;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;


@RestController
@Slf4j
@RequestMapping("/common")
public class FileController {
//    @PostMapping("/upload")
//    public R up( @RequestBody MultipartFile file){
//        /*// Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
//        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
//        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
//        String accessKeyId = "LTAI5tB3iFdYUzc6ypg6cjz5";
//        String accessKeySecret = "wfmKt0sP8I2dbhhURv03fMgkvggiU3";
//        String originalFilename = file.getOriginalFilename();
//        String[] split = originalFilename.split("\\.");
//        String fileName = split[0];
//        String suffixName = "."+split[1];
//        log.info(fileName);
//        log.info(suffixName);
//
//        // 填写Bucket名称，例如examplebucket。
//        String bucketName = fileName;
//        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
//        String objectName = "tupian";
//        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
//        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
//        String filePath= "D:\\Java_reggie_waimai\\tupian\\"+originalFilename;
//
//        // 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//
//        try {
//            // 创建PutObjectRequest对象。
//            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
//            // 如果需要上传时设置存储类型和访问权限，请参考以下示例代码。
//            // ObjectMetadata metadata = new ObjectMetadata();
//            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
//            // metadata.setObjectAcl(CannedAccessControlList.Private);
//            // putObjectRequest.setMetadata(metadata);
//
//            // 设置该属性可以返回response。如果不设置，则返回的response为空。
//            putObjectRequest.setProcess("true");
//
//            // 上传文件。
//            PutObjectResult result = ossClient.putObject(putObjectRequest);
//            // 如果上传成功，则返回200。
//            System.out.println(result.getResponse().getStatusCode());
//        } catch (OSSException oe) {
//            System.out.println("Caught an OSSException, which means your request made it to OSS, "
//                    + "but was rejected with an error response for some reason.");
//            System.out.println("Error Message:" + oe.getErrorMessage());
//            System.out.println("Error Code:" + oe.getErrorCode());
//            System.out.println("Request ID:" + oe.getRequestId());
//            System.out.println("Host ID:" + oe.getHostId());
//        } catch (ClientException ce) {
//            System.out.println("Caught an ClientException, which means the client encountered "
//                    + "a serious internal problem while trying to communicate with OSS, "
//                    + "such as not being able to access the network.");
//            System.out.println("Error Message:" + ce.getMessage());
//        } finally {
//            if (ossClient != null) {
//                ossClient.shutdown();
//            }
//        }
//        return R.success("上传成功");
//*/
//        String filename = file.getOriginalFilename();
//        String[] split = filename.split("\\.");
//        String fileName = split[0];
//        String suffixName = "."+split[1];
//        String path = "D:\\Java_reggie_waimai\\tupian";
//        File dir = new File(path);
//        if(!dir.exists()){
//            dir.mkdirs();
//        }
//        try {
//            file.transferTo(new File(path,fileName+suffixName));
//        } catch (IOException e) {
//            throw new FileException("数据上传出现问题");
//        }
//        return R.success(fileName+suffixName);
//    }

    @PostMapping("/upload")
    public R up2( @RequestBody MultipartFile file){

        //必填***** Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        //必填***** 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tBL3xzM3cuBfExu4gnX";
        String accessKeySecret = "gmEbf3RD1cDYIkjjGhUokohGGlLk3x";
        //必填***** 填写Bucket名称，例如examplebucket。
        String bucketName = "reggie-dish-image";
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        String name = file.getOriginalFilename();
        String objectName = "reggie-dish-image/"+name;
                // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
                // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        //String filePath= "D:\\localpath\\examplefile.txt";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        PutObjectRequest putObjectRequest = null;
        try {
            putObjectRequest = new PutObjectRequest(bucketName, objectName, file.getInputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

            // 设置该属性可以返回response。如果不设置，则返回的response为空。
            putObjectRequest.setProcess("true");
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            // 如果上传成功，则返回200。
            System.out.println(result.getResponse().getStatusCode());


        return R.success(name);
    }
    @CrossOrigin
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {

        /*response.setHeader("Content-Disposition","attachment; filename="+name);// 强制要求浏览器下载。
        response.setContentType("image/jpeg");// 告知浏览器响应的内容类型
        String path = "D:\\Java_reggie_waimai\\tupian";
        FileInputStream stream;
        ServletOutputStream outputStream;
        try {
            stream = new FileInputStream(new File(path, name));
            outputStream = response.getOutputStream();
            IOUtils.copy(stream, outputStream);
        } catch (FileNotFoundException e) {
            throw new FileException("文件下载出错");
        } catch (IOException e) {
            throw new FileException("文件下载出错");
        }*/

// Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。关于其他Region对应的Endpoint信息，请参见访问域名和数据中心。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tBL3xzM3cuBfExu4gnX";
        String accessKeySecret = "gmEbf3RD1cDYIkjjGhUokohGGlLk3x";
        // 填写Bucket名称，例如examplebucket。
        String bucketName = "reggie-dish-image";
        // 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "reggie-dish-image/"+name;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);
        try {
            IOUtils.copy(ossObject.getObjectContent(),response.getOutputStream());
            ossObject.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
